#ifndef DRAGCONTEXT_H
#define DRAGCONTEXT_H

#include <QList>
#include <QObject>
#include <QTimer>

/**
 * @brief 拖拽上下文管理类
 * 
 * 负责管理拖拽过程中的状态和位置信息，确保拖拽位置信息
 * 在整个拖拽过程中得到可靠保存和传递。
 */
class DragContext : public QObject
{
    Q_OBJECT

public:
    explicit DragContext(QObject *parent = nullptr);
    ~DragContext();

    // 拖拽状态管理
    bool isDragInProgress() const { return m_isDragInProgress; }
    void startDrag(const QList<int>& sourceIndices);
    void setTargetIndex(int targetIndex);
    void completeDrag();
    void cancelDrag();

    // 位置信息管理
    QList<int> getSourceIndices() const { return m_sourceIndices; }
    int getTargetIndex() const { return m_targetIndex; }
    QList<int> getNewPositions() const { return m_newPositions; }
    
    // 计算新位置
    void calculateNewPositions(int fileCount);
    
    // 延迟执行管理
    void scheduleDelayedAction(std::function<void()> action, int delayMs = 100);
    void cancelDelayedActions();

signals:
    void dragStarted(const QList<int>& sourceIndices);
    void dragCompleted(const QList<int>& newPositions);
    void dragCancelled();

private slots:
    void executeDelayedAction();

private:
    // 拖拽状态
    bool m_isDragInProgress = false;
    QList<int> m_sourceIndices;      // 源索引
    int m_targetIndex = -1;          // 目标索引
    QList<int> m_newPositions;        // 计算后的新位置
    
    // 延迟执行管理
    QTimer* m_delayedActionTimer;
    std::function<void()> m_delayedAction;
    bool m_hasDelayedAction = false;
};

#endif // DRAGCONTEXT_H
